package com.example.reflect.demo;

import org.springframework.boot.autoconfigure.security.SecurityProperties;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Test {


    private Field[] declaredFields;

    public static void main(String[] args) {

        //---------1.与java反射相关的类如下--------------
        //1.Class:代表类的实体，在运行的java应用程序中表示类和接口
        //2.Field:代表类的成员变量(成员变量也称为类的属性)
        //3.Method:代表类的方法
        //4.Constructor:代表类的构造方法

        Class<?> myClass = null;
        try {
            myClass = Class.forName("com.example.reflect.demo.UserController");
            // myClass = UserController.class;
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        //---------2.获取UserController类的所有属性--------------------

        Field[] declaredFields = myClass.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            System.out.println("属性名:" + declaredField.getName());
            System.out.println("修饰符:" + declaredField.getModifiers());
        }


        //---------3.获取UserController类所有方法
        Method[] declaredMethods = myClass.getDeclaredMethods();
        for (Method declaredMethod : declaredMethods) {
            System.out.println("方法名:" + declaredMethod.getName());
            System.out.println("修饰符:" + declaredMethod.getModifiers());
        }


        //---------4.调用UserController类的方法
        Method setUserAge = null;
        try {//getDeclaredMethod 调用所有方法
            setUserAge = myClass.getDeclaredMethod("setUserAge", int.class);
            setUserAge.setAccessible(true);//调用私有方法
            setUserAge.invoke(myClass.newInstance(), 11);
        } catch (Exception e) {
            e.printStackTrace();
        }

        //----------5.调用方法参数为对象的
      /*  Method setUserAge = null;
        try {//getDeclaredMethod 可以调用私有和公有所有方法，getMethod只能调用private方法
            setUserAge = myClass.getDeclaredMethod("setUserName", User.class);
            User user = new User();
            user.setName("郑智伟");
            setUserAge.invoke(UserController.class.newInstance(),user);
        } catch (Exception e) {
            e.printStackTrace();
        }
*/

    }


}
